#pragma once
#include "Socket.h"
#include "EventLoop.h"
#include <string>
#include "Channel.h"
#include "InetAddress.h"
#include "Epoll.h"
#include "Acceptor.h"
#include<map>
#include"Connection.h"
// TcpServer网路服务类
class TcpServer
{
    
public:
    TcpServer(std::string &ip, uint16_t &port);
    ~TcpServer();

    void start();
    void newConnection(Socket *clientsock);
    void closeconnection(Connection *conn);
    void errorconnection(Connection *conn);
    void onmessage(Connection *conn, std::string message);
    void sendcomplete(Connection* conn);
    void epolltimeout(EventLoop *loop);


    void setnewConnectioncb( std::function<void(Connection *)>  fn);
    void setcloseConnectioncb(std::function<void(Connection*)> fn);
    void seterrorConnectioncb(std::function<void(Connection*)> fn);
    void setonMessagecb(std::function<void(Connection*, std::string&)> fn);
    void setsendCompletecb(std::function<void(Connection*)> fn);
    void setepollTimeoutcb(std::function<void(EventLoop*)> fn); 
   
   

private:
    EventLoop loop_;
    Acceptor *acceptor_;
    std::map<int,Connection*> conns_;
    std::function<void(Connection *)> newConnectioncb_; // 设置newConnection回调函数
    std::function<void(Connection*)> closeConnectioncb_; // 设置closeConnection回调函数
    std::function<void(Connection*)> errorConnectioncb_; // 错误回调函数
    std::function<void(Connection*, std::string& message)> onMessagecb_; //  消息回调函数
    std::function<void(Connection*)> sendCompletecb_; //     发送完成回调函数
    std::function<void(EventLoop*)> epollTimeoutcb_; // epoll超时回调函数
};
